package com.taotao.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.taotao.common.pojo.EUTreeNode;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.mapper.TbContentCategoryMapper;
import com.taotao.pojo.TbContentCategory;
import com.taotao.pojo.TbContentCategoryExample;
import com.taotao.pojo.TbContentCategoryExample.Criteria;
import com.taotao.service.ContentCategoryService;
/**
 * 内容分类管理
 * @author Administrator
 *
 */
@Service
public class ContentCategoryServiceImpl implements ContentCategoryService {

	@Autowired
	private TbContentCategoryMapper contentCategoryMapper;
	
	@Override
	public List<EUTreeNode> getCategoryList(long parentId) {
		//根据parentid查询节点列表
		TbContentCategoryExample example = new TbContentCategoryExample();
		Criteria criteria = example.createCriteria();
		criteria.andParentIdEqualTo(parentId);
		
		//执行查询
		List<TbContentCategory> list = contentCategoryMapper.selectByExample(example);
		List<EUTreeNode> resuList = new ArrayList<>();
		for(TbContentCategory tbContentCategory : list){
			//创建节点
			EUTreeNode node = new EUTreeNode();
			node.setId(tbContentCategory.getId());
			node.setText(tbContentCategory.getName());
			node.setState(tbContentCategory.getIsParent()?"closed":"opene");
			resuList.add(node);
		}
		return resuList;
	}
	//新增
	@Override
	public TaotaoResult insertContentCategory(long parentId, String name) {
		//创建一个pojo
		TbContentCategory contentCategory = new TbContentCategory();
		contentCategory.setName(name);
		contentCategory.setIsParent(false);
		//状态。可选值:1(正常),2(删除)
		contentCategory.setStatus(1);
		contentCategory.setParentId(parentId);
		contentCategory.setSortOrder(1);
		contentCategory.setCreated(new Date());
		contentCategory.setUpdated(new Date());
		//添加记录
		contentCategoryMapper.insert(contentCategory);
		//查看父节点的IsParent列是否为true，如果不是true改成true
		TbContentCategory parentCat = contentCategoryMapper.selectByPrimaryKey(parentId);
		//判断是否为true
		if(!parentCat.getIsParent()){
			parentCat.setIsParent(true);
			//更新父节点
			contentCategoryMapper.updateByPrimaryKey(parentCat);
		}
		//返回结果
		return TaotaoResult.ok(contentCategory);
	}
	
	 //通过父节点id来查询所有子节点，这是抽离出来的公共方法  
    private List<TbContentCategory> getContentCategoryListByParentId(long parentId){  
        TbContentCategoryExample example = new TbContentCategoryExample();  
        Criteria criteria = example.createCriteria();  
        criteria.andParentIdEqualTo(parentId);  
        List<TbContentCategory> list = contentCategoryMapper.selectByExample(example);  
        return list;  
    }  
      
    //递归删除节点  
    private void deleteNode(long parentId){  
        List<TbContentCategory> list = getContentCategoryListByParentId(parentId);  
        for(TbContentCategory contentCategory : list){  
            contentCategory.setStatus(2);  
            contentCategoryMapper.updateByPrimaryKey(contentCategory);  
            if(contentCategory.getIsParent()){  
                deleteNode(contentCategory.getId());  
            }  
        }  
    }  
  
    @Override  
    public TaotaoResult deleteContentCategory(long id) {  
        //删除分类，就是改节点的状态为2  
        TbContentCategory contentCategory = contentCategoryMapper.selectByPrimaryKey(id);  
        //状态。可选值:1(正常),2(删除)  
        contentCategory.setStatus(2);  
        contentCategoryMapper.updateByPrimaryKey(contentCategory);  
        //我们还需要判断一下要删除的这个节点是否是父节点，如果是父节点，那么就级联  
        //删除这个父节点下的所有子节点（采用递归的方式删除）  
        if(contentCategory.getIsParent()){  
            deleteNode(contentCategory.getId());  
        }  
        //需要判断父节点当前还有没有子节点，如果有子节点就不用做修改  
        //如果父节点没有子节点了，那么要修改父节点的isParent属性为false即变为叶子节点  
        TbContentCategory parent = contentCategoryMapper.selectByPrimaryKey(contentCategory.getParentId());  
        List<TbContentCategory> list = getContentCategoryListByParentId(parent.getId());  
        //判断父节点是否有子节点是判断这个父节点下的所有子节点的状态，如果状态都是2就说明  
        //没有子节点了，否则就是有子节点。  
        boolean flag = false;  
        for(TbContentCategory tbContentCategory : list){  
            if(tbContentCategory.getStatus() == 0){  
                flag = true;  
                break;  
            }  
        }  
        //如果没有子节点了  
        if(!flag){  
        	contentCategory.setIsParent(false);  
            contentCategoryMapper.deleteByPrimaryKey(contentCategory.getId()); 
        }  
        //返回结果  
        return TaotaoResult.ok();  
    }  
}
